package com.example.demo.common;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * @Author: wenjingyuan
 * @Date: 2023/09/07/16:55
 * @Description:密码工具类
 */
public class PasswordUtils {
    /*
    加盐加密
     */
    public static String encrypt(String password){
        //1.先拿到盐值
        String salt= UUID.randomUUID().toString().replace("-","");
        //2.将盐值+原始密码进行md5加密得到最终密码
        String finalPd=DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
        //3.返回盐值+$+最终密码
        return salt+"$"+finalPd;
    }

    /**
     * 加盐解密
     * @param password 待验证的密码
     * @param dbPassword 数据库的保存密码
     * @return
     */
    public static boolean decrypt(String password,String dbPassword){
        //password有则返回true
        // StringUtils.hasLength(password)password没有则返回false
        //!StringUtils.hasLength(password) 则返回true 才能够执行括号里的方法体
        // 我想表达的意思是如果password为空
        // 或者dbPassword为空
        if(!StringUtils.hasLength(password) ||
                !StringUtils.hasLength(dbPassword)
        || dbPassword.length()<65){
            return false;
        }
        //1.得到盐值
        String[] dbPasswordArray=dbPassword.split("\\$");
        if(dbPasswordArray.length!=2){
            return false;
        }
        //盐值
        String salt=dbPasswordArray[0];
        //最终密码
        String dbFinalPassword=dbPasswordArray[1];
        //2.将盐值和待验证的密码进行MD5加密
        String finalPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
        //3.对比加密后的密码和数据库的后边的那部分 相同则正确
        if (finalPassword.equals(dbFinalPassword)){
            return true;
        }
        return false;
    }
}
